package package01;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * @Description 容器
 * @Author zzj
 * @Date 2020/7/24 8:50
 */
public class Container<T> {
    // 使用队列存放泛型
    private volatile LinkedBlockingDeque<T> queue;
    // 单例：懒汉式（双保险）
    private static volatile Container container;

    // 构造函数私有化（无参默认队列大小为100）
    private Container() {
        //初始化队列
        this(100);
    }

    // 重载构造函数
    private Container(int size) {
        //初始化队列
        this.queue = new LinkedBlockingDeque<>(size);
    }

    // 单例（双保险）
    public static synchronized <T> Container<T> getInstance() {
        if (container == null) {
            container = new Container<T>();
        }
        return container;
    }

    // 向队列中添加产品
    public void add(T t) {
        boolean flag;
        do {
            flag = queue.offer(t);
        } while (!flag);
    }

    // 消费产品
    public T consume() {
        T o;
        do {
            o = queue.poll();
        } while (o == null);
        return (T) o;
    }
}
